/*
    SUSAN® - Sole of Unix Save ANything

   Copyright (C) 2009-2011 Hechzh Property
   Copyright (C) 2016-2016 Skyatlas Co. CN
   Copyright (C) 2016-2020 Hechzh Property

   
*/
#ifndef BAREOS_CATS_BDB_POSTGRESQL_H_
#define BAREOS_CATS_BDB_POSTGRESQL_H_ 1

#include "include/bareos.h"
#include "cats/column_data.h"

#include <string>
#include <vector>

struct AttributesDbRecord;
class JobControlRecord;

class BareosDbPostgresql : public BareosDbPrivateInterface {
 private:
  /*
   * Members.
   */
  PGconn* db_handle_;
  PGresult* result_;
  POOLMEM* buf_; /**< Buffer to manipulate queries */
  static const char*
      query_definitions[]; /**< table of predefined sql queries */

 private:
  /*
   * Methods.
   */
  bool OpenDatabase(JobControlRecord* jcr) override;
  void CloseDatabase(JobControlRecord* jcr) override;
  bool ValidateConnection(void) override;
  void EscapeString(JobControlRecord* jcr,
                    char* snew,
                    const char* old,
                    int len) override;
  char* EscapeObject(JobControlRecord* jcr, char* old, int len) override;
  unsigned char* EscapeObject(const unsigned char* old,
                              std::size_t old_len,
                              std::size_t& new_len) override;
  void FreeEscapedObjectMemory(unsigned char* obj) override;
  void UnescapeObject(JobControlRecord* jcr,
                      char* from,
                      int32_t expected_len,
                      POOLMEM*& dest,
                      int32_t* len) override;
  void StartTransaction(JobControlRecord* jcr) override;
  void EndTransaction(JobControlRecord* jcr) override;
  bool BigSqlQuery(const char* query,
                   DB_RESULT_HANDLER* ResultHandler,
                   void* ctx) override;
  bool SqlQueryWithHandler(const char* query,
                           DB_RESULT_HANDLER* ResultHandler,
                           void* ctx) override;
  bool SqlQueryWithoutHandler(const char* query, int flags = 0) override;
  void SqlFreeResult(void) override;
  SQL_ROW SqlFetchRow(void) override;
  const char* sql_strerror(void) override;
  void SqlDataSeek(int row) override;
  int SqlAffectedRows(void) override;
  uint64_t SqlInsertAutokeyRecord(const char* query,
                                  const char* table_name) override;
  SQL_FIELD* SqlFetchField(void) override;
  bool SqlFieldIsNotNull(int field_type) override;
  bool SqlFieldIsNumeric(int field_type) override;
  bool SqlBatchStartFileTable(JobControlRecord* jcr) override;
  bool SqlBatchEndFileTable(JobControlRecord* jcr, const char* error) override;
  bool SqlBatchInsertFileTable(JobControlRecord* jcr,
                               AttributesDbRecord* ar) override;
  bool SqlCopyStart(const std::string& table_name,
                    const std::vector<std::string>& column_names) override;
  bool SqlCopyInsert(const std::vector<DatabaseField>& data_fields) override;
  bool SqlCopyEnd() override;

  bool CheckDatabaseEncoding(JobControlRecord* jcr);

 public:
  /*
   * Methods.
   */
  BareosDbPostgresql(JobControlRecord* jcr,
                     const char* db_driver,
                     const char* db_name,
                     const char* db_user,
                     const char* db_password,
                     const char* db_address,
                     int db_port,
                     const char* db_socket,
                     bool mult_db_connections,
                     bool disable_batch_insert,
                     bool try_reconnect,
                     bool exit_on_fatal,
                     bool need_private);
  ~BareosDbPostgresql();
};

#endif /* BAREOS_CATS_BDB_POSTGRESQL_H_ */
